package main

import "fmt"

func printSlice(s []int) {
	fmt.Printf("%v,len=%d,cap=%d\n", s, len(s), cap(s))
}

// sliceops的其他操作
func main() {
	//直接定义slice
	var s []int // go语言的特点，只要定义就会有 zero value 空值 slice 默认值是nil
	// 直接给slice赋值
	for i := 0; i < 100; i++ {
		printSlice(s) // 会发现slice的cap放不下时会自动增大
		s = append(s, 2*i+1)
	}
	fmt.Println(s)
	s1 := []int{2, 4, 6, 8}
	fmt.Println(s1)
	s2 := make([]int, 16)     // 创建一个长度为16的slice 会用0填充该slice
	s3 := make([]int, 10, 32) // 创建一个长度为10,cap为32的slice
	printSlice(s2)
	printSlice(s3)

	fmt.Println("copying slice")
	copy(s2, s1) //会把s1的2468 填充到s2中
	printSlice(s2)

	fmt.Println("deleteing elements from slice")
	// go 没有提供删除方法 只能通过reslice实现
	// 删除s2中下标为3的数据
	// s2[:3]+s2[4:] 即可排除到下标3的数据，但go中没有加法
	// 使用append来实现
	// 因为append的第二个参数是个可变参数必须一个一个往里传递，解决方案使用 类似javascript中的扩展运算符...实现
	s2 = append(s2[:3], s2[4:]...)
	printSlice(s2) // 得到的结果原下标3的数据已经没了，变成0，长度为15 cap还是16，因为go语言认为没必要缩小

	fmt.Println("poping from front") //删除头
	front := s2[0]
	s2 = s2[1:]
	fmt.Println("poping from back") //删除尾
	back := s2[len(s2)-1]
	s2 = s2[:len(s2)-1]
	fmt.Println(front, back)
	printSlice(s2)
}
